package models;

import static java.lang.String.format;
import static java.lang.String.valueOf;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;

import play.db.jpa.GenericModel;
import play.db.jpa.Model;
import play.libs.F.Tuple;

@Entity
public class Curso extends Model {

	public boolean ativo;
	public String descricao;
	public int numDeNiveis;

	@ManyToMany(mappedBy = "cursos", cascade = CascadeType.ALL)
	public List<Professor> professores;

	@OneToMany(mappedBy = "curso")
	public List<Nivel_Semestre> niveisSemestre;

	public static Tuple<Boolean, List<Nivel_Semestre>> abrirSemestre() {
		final Tuple<Boolean, List<Nivel_Semestre>> resposta;
		
		final List<Semestre> semestresAtivo = GenericModel.find(
				"select s from Semestre s where s.ativo=true").fetch();
		if (semestresAtivo.isEmpty()) {
			final Semestre semestre = new Semestre();
			final List<Nivel_Semestre> niveisSemestre = new ArrayList();
			final List<Curso> cursosAtivos = GenericModel.find(
					"select c from Curso c where c.ativo=true").fetch();
			for (Curso curso : cursosAtivos) {
				for (int i = 0; i < curso.numDeNiveis; i++) {
					final Nivel_Semestre nivelSemestre = new Nivel_Semestre();
					nivelSemestre.curso = curso;
					nivelSemestre.nivel = i + 1;
					nivelSemestre.semestre = semestre;
					niveisSemestre.add(nivelSemestre);
				}
			}
			resposta = new Tuple(Boolean.TRUE, niveisSemestre);
		} else {
			resposta = new Tuple(Boolean.FALSE, Collections.EMPTY_LIST);
		}
		return resposta;

	}

	public static void inserir(Semestre semestre,
			List<Nivel_Semestre> niveis_semestre, final String codSemestre) {
		
		semestre.ativo = true;
		for (Nivel_Semestre nivel : niveis_semestre) {
			nivel.semestre = semestre;
			final List<Curso> curso = GenericModel.find("byDescricao",
					nivel.curso.descricao).fetch();
			nivel.curso = curso.get(0);
			nivel.curso.save();
			nivel.semestre.save();
			nivel.save();
			for (int i = 0; i < nivel.numTurmas; i++) {
				final Turma turma = new Turma();
				turma.ativa = false;
				turma.nivelSemestre = nivel;
				final String codigo = format("%s%s.%s.%s",
						nivel.curso.descricao.substring(0, 2).toUpperCase(),
						nivel.nivel, codSemestre, valueOf(i + 1));
				turma.cod = codigo;
				turma.save();
			}
		}
	}
}